import numpy as np
import matplotlib.pyplot as plt

# 创建示例数据
np.random.seed(0)
X = np.random.rand(100, 30)  # 100个样本，30个特征

# 步骤 1: 数据标准化
X_meaned = X - np.mean(X, axis=0)

# 步骤 2: 计算协方差矩阵
covariance_matrix = np.cov(X_meaned, rowvar=False)

# 步骤 3: 计算特征值和特征向量
eigenvalues, eigenvectors = np.linalg.eig(covariance_matrix)

# 步骤 4: 选择主成分
# 将特征值和特征向量按特征值从大到小排序
sorted_indices = np.argsort(eigenvalues)[::-1]
sorted_eigenvalues = eigenvalues[sorted_indices]
sorted_eigenvectors = eigenvectors[:, sorted_indices]

# 选择前 k 个主成分 (例如 k = 2)
k = 2
W = sorted_eigenvectors[:, :k]

# 步骤 5: 投影原始数据到新的特征空间
X_reduced = np.dot(X_meaned, W)

# 打印结果
print('原始数据:\n', X)
print('降维后的数据:\n', X_reduced)

# 可视化降维后的数据 (如果是二维数据)
if k == 2:
    plt.scatter(X_reduced[:, 0], X_reduced[:, 1], color='blue')
    plt.title('PCA Reduced Data')
    plt.xlabel('Principal Component 1')
    plt.ylabel('Principal Component 2')
    plt.grid()
    plt.show()